package com.linln.common.utils;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.math.BigInteger;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by lizhou on 2018年08月22日 08时50分
 */
public class StringUtils {
    private static final Logger log = LogManager.getLogger(StringUtils.class);

    /**
     * GB2312中共有7445个字符符号：汉字符号（常用的)6763个（一级汉字3755个，二级汉字3008个），非汉字符号682个
     */
    private final static CharsetEncoder gb2312 = Charset.forName("gb2312").newEncoder();

    public static final String EMAIL_REG = "([a-zA-Z0-9_\\.\\-])+\\@(([a-zA-Z0-9\\-])+\\.)+([a-zA-Z]{2,4})+";

    public static final String MOBILE_NUM_REG = "^1[3456789]\\d{9}$";
    public static final String MOBILE_NUM2_REG = "1[3456789]\\d{1}(-)?\\d{4}(-)?\\d{4}";


    /**
     * 正则匹配电子邮箱
     * @param str
     * @return
     */
    public static String findEmail(String str){
        if(isEmpty(str)){
            return null;
        }
        return RegexUtil.findMatchContent(EMAIL_REG,str);
    }

    /**
     * 正则匹配手机号码
     * @param str
     * @return
     */
    public static String findMobileNum(String str){
        if(isEmpty(str)){
            return null;
        }
        String matched =  RegexUtil.findMatchContent(MOBILE_NUM_REG,str);
        if(isEmpty(matched)){
            matched =  RegexUtil.findMatchContent(MOBILE_NUM2_REG,str);
            if(isNotEmpty(matched)){
                matched = matched.replace("-","");
            }
        }
        return matched;
    }


    public static boolean isValidPhoneNO(String phoneNum){
        if(isNotEmpty(phoneNum)) return false;
        String regexp="^1[3|4|5|6|7|8|9][0-9]\\d{8}$";
        return phoneNum.matches(regexp);
    }

    /**
     * 判断是否包含内网IPv4
     * @param ip 合法的ip地址
     * @return boolean
     */
    public static  boolean isContainInnerIPv4(String ip) {
        String reg = "(10|172|192)\\.([0-1][0-9]{0,2}|[2][0-5]{0,2}|[3-9][0-9]{0,1})\\.([0-1][0-9]{0,2}|[2][0-5]{0,2}|[3-9][0-9]{0,1})\\.([0-1][0-9]{0,2}|[2][0-5]{0,2}|[3-9][0-9]{0,1})";
        Pattern p = Pattern.compile(reg);
        Matcher matcher = p.matcher(ip);
        return matcher.find();
    }

    /**
     * 获取 字符串是否空
     *
     * @param string
     *            字符串
     * @return 字符串是否空
     */
    public static boolean isEmpty(String string) {
        return string == null || string.equals("") || string.trim().equals("") || "null".equalsIgnoreCase(string);
    }

    /**
     * 获取 字符串是否空
     *
     * @param string
     *            字符串
     * @return 字符串是否空
     */
    public static boolean isNotEmpty(String string) {
        return !isEmpty(string);
    }
    /**
     * 字符串转16进制
     * @param str
     * @return
     */
    public static String stringToHex(String str){
        String value="";
        if(null == str || "".equals(str) || str.length() == 0){
            return value;
        }
        try{
            for(int i = 0 ;i<str.length();i++){
                if("".equals(value) ){
                    value =  String.format("%x", new BigInteger(1, String.valueOf(str.charAt(i)).getBytes("UTF-8")));;
                }else {
                    value +=  String.format("%x", new BigInteger(1, String.valueOf(str.charAt(i)).getBytes("UTF-8")));;
                }
            }
        }catch (Exception e){
            log.error(e.getMessage(),e);
        }
        return value;
    }



    /**
     * unicode的字符串转中文
     * @param unicode
     * @return
     */
    public static String unicodeToCn(String unicode) {
//        /** 以 \ u 分割，因为java注释也能识别unicode，因此中间加了一个空格*/
//        String[] strs = unicode.split("\\\\u");
//        String returnStr = "";
//        // 由于unicode字符串以 \ u 开头，因此分割出的第一个字符是""。
//        for (int i = 1; i < strs.length; i++) {
//            returnStr += (char) Integer.valueOf(strs[i], 16).intValue();
//        }
//        return returnStr;

        int start = 0;
        int end = 0;
        StringBuffer buffer = new StringBuffer();
        while (start > -1) {
            end = unicode.indexOf("\\u", start + 2);
            String charStr = "";
            if (end == -1) {
                charStr = unicode.substring(start + 2, unicode.length());
            } else {
                charStr = unicode.substring(start + 2, end);
            }
            char letter = (char) Integer.parseInt(charStr, 16); // 16进制parse整形字符串。
            buffer.append(new Character(letter).toString());
            start = end;
        }
        return buffer.toString();


    }

    /**
     * 中文字符串转成unicode的字符串
     * @param cn
     * @return
     */
    public static String cnToUnicode(String cn) {
        char[] chars = cn.toCharArray();
        String returnStr = "";
        for (int i = 0; i < chars.length; i++) {
            returnStr += "\\u" + Integer.toString(chars[i], 16);
        }
        return returnStr;
    }


    /**
     * 首字母大写（只对英文字母有效）
     版权声明：本文为CSDN博主「lockie_zou」的原创文章，遵循 CC 4.0 BY-SA 版权协议，转载请附上原文出处链接及本声明。
     原文链接：https://blog.csdn.net/zxl646801924/article/details/80061954
     * @param str
     * @return
     */
    public static String upperCase(String str) {
        if(isEmpty(str)){
            return str;
        }
        str = str.trim();
        if(isEmpty(str)){
            return str;
        }
        char[] ch = str.toCharArray();
        if (ch[0] >= 'a' && ch[0] <= 'z') {
            ch[0] = (char) (ch[0] - 32);
        }
        return new String(ch);
    }



}
